package com.tungse;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;

public class RobustBase64FileDecoder {

    public static void main(String[] args) {
        String filePath = "D:\\Users\\Tungse\\Desktop\\base64str.txt"; // 包含Base64编码字符串的文件路径

        try {
            // 1. 从文件中读取内容
            String fileContent = readFileAsString(filePath);

            // 2. 清理Base64字符串 - 移除所有非Base64字符
            String base64Encoded = cleanBase64String(fileContent);

            // 3. 检查长度是否为4的倍数，如果不是则补全
            base64Encoded = padBase64String(base64Encoded);

            // 4. 解码Base64字符串
            byte[] decodedBytes = Base64.getDecoder().decode(base64Encoded);

            // 5. 将解码后的字节数组转换为字符串（假设是XML/文本数据）
            String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);

            System.out.println("解码后的内容:");
            System.out.println(decodedString);

        } catch (IOException e) {
            System.err.println("读取文件时出错: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            System.err.println("Base64解码失败: " + e.getMessage());
        }
    }

    /**
     * 读取文件内容为字符串
     */
    private static String readFileAsString(String filePath) throws IOException {
        return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
    }

    /**
     * 清理Base64字符串，移除非Base64字符
     */
    private static String cleanBase64String(String input) {
        // Base64正则表达式: A-Z, a-z, 0-9, +, /, =
        return input.replaceAll("[^A-Za-z0-9+/=]", "");
    }

    /**
     * 补全Base64字符串长度到4的倍数
     */
    private static String padBase64String(String input) {
        int length = input.length();
        if (length % 4 != 0) {
            int padding = 4 - (length % 4);
            input += "====".substring(0, padding);
        }
        return input;
    }
}